{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tonality analysis: chords estimation\n",
    "\n",
    "Essentia provides two basic algorithms for chord estimation given a harmonic representation of input audio in a form of an *HPCPgram* (HPCP chromagram; see the [HPCP tutorial](tutorial_tonal_hpcpkeyscale.html) for how to compute it):\n",
    "\n",
    "- [ChordsDetection](https://essentia.upf.edu/documentation/reference/std_ChordsDetection.html) is a naive algorithm estimating chords in a sliding window over an input HPCP chromagram.\n",
    "- [ChordsDetectionBeats](https://essentia.upf.edu/documentation/reference/std_ChordsDetectionBeats.html) is a similar algorithm, but it estimates chords on segments between consecutive beats given their time positions as an additional input.\n",
    "\n",
    "In addition, [ChordsDescriptors](https://essentia.upf.edu/documentation/reference/std_ChordsDescriptors.html) describes the estimated chord progression by means of key, scale, histogram, and rate of change."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The analysis pipeline to compute HPCPs in this example is identical to the one used the HPCP tutorial to compute a 12-bin HPCPgram:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import essentia.streaming as ess\n",
    "import essentia\n",
    "\n",
    "audio_file = '../../../test/audio/recorded/mozart_c_major_30sec.wav'\n",
    "\n",
    "# Initialize algorithms we will use.\n",
    "loader = ess.MonoLoader(filename=audio_file)\n",
    "framecutter = ess.FrameCutter(frameSize=4096, hopSize=2048, silentFrames='noise')\n",
    "windowing = ess.Windowing(type='blackmanharris62')\n",
    "spectrum = ess.Spectrum()\n",
    "spectralpeaks = ess.SpectralPeaks(orderBy='magnitude',\n",
    "                                  magnitudeThreshold=0.00001,\n",
    "                                  minFrequency=20,\n",
    "                                  maxFrequency=3500, \n",
    "                                  maxPeaks=60)\n",
    "\n",
    "# Use default HPCP parameters for plots.\n",
    "# However we will need higher resolution and custom parameters for better Key estimation.\n",
    "\n",
    "hpcp = ess.HPCP()\n",
    "\n",
    "# Use pool to store data.\n",
    "pool = essentia.Pool() \n",
    "\n",
    "# Connect streaming algorithms.\n",
    "loader.audio >> framecutter.signal\n",
    "framecutter.frame >> windowing.frame >> spectrum.frame\n",
    "spectrum.spectrum >> spectralpeaks.spectrum\n",
    "spectralpeaks.magnitudes >> hpcp.magnitudes\n",
    "spectralpeaks.frequencies >> hpcp.frequencies\n",
    "hpcp.hpcp >> (pool, 'tonal.hpcp')\n",
    "\n",
    "# Run streaming network.\n",
    "essentia.run(loader)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot the resulting HPCP:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6UrmgBo/hxBFBK0txBs3Eyd9OqyrIeroIqzzx7gohnx+yPxvmYy/tsm9Ne7p2b4fDdN13gmkemPqP7USgO7/mEjFU2uIxzZiPf6eR1snrqeHrtMPA6DugVUU1vp11ZB7Xul6e1j/Lm2fsKHeV7OtfZfNZOkMaz46l0m3+zFp3X1Ydy9xR2exjkFlJb2nHkrV4i0AdB7WQsWmflIPP52UJblf5nLEx/s6pDZ1wtY23Dg/j+fGVlOxeAOFiU0A9EyopLcxYOz1T9N/1DR/Tk+eO+7793nOubkjlVVPzkRERERERMqAgjMREREREZEyoOBMRERERESkDCg4ExERERERKQMKzkRERERERMqAgjMREREREZEyoOBMRERERESkDCg4ExERERERKQMKzkRERERERMqAgjMREREREZEyoOBMRERERESkDCg4ExERERERKQMKzkRERERERMqAgjMREREREZEyoOBMRERERESkDCg4ExERERERKQMKzkRERERERMqAgjMREREREZEyoOBMRERERESkDCg4ExERERERKQMKzkRERERERMqAgjMREREREZEyoOBMRERERESkDCg4ExERERERKQMKzkRERERERMqAgjMREREREZEyYM65fZZZXdDsTpj7EQD6WioBWP/uPp5+6S8AOOz7l9D0dIHVrzIApvwxJtORJ2zvA6Bzdj3pi9ZTeXFAvGotAK6/f1TLGFRXAxB3d2OpFK5QGNxpBqXtFYQQR889E7PBn0ep/S2dwRXyYEm87eIdp33cHABuveEXvH/VSdy7+gDix+sBOPB7C4jaOwibGgGI2zuGtsGO8s9mcfnCrvPe7sSkLZwDMyyT4eoldwIwNqxmXaGLviSpp/Jj+PJ/vps7v/odruuaAsDf22ax+iW9Q6/Djto3CAfLZ4H/d/gxpeUZdo6l0r6NB5KrrCTu6ydsbgIgbmvHKrKQ98f0vPJwVp1uHHTFNqy71yfT0UXc2YmLoqH5DGsHnNtxeYGgqoq4t4+wvg6AqK0NnCOoqPCnFAoQhliSrk2bAms3EPf2QZL3dte1tH8Pb4eRjtnZtpEMHy9mxf4aNjdBfQ3xijUEMw8AIK7OgnPYMyv84VWVWHUV0Zp1/vyBekTRYL8fyKoiW9wXZLM453C9yTWIHRYYz1x2NAAHfeJJ4p6e516f4XbjvF+vupcIR4X5a/tUPuSp/olcULsegGcLvZz74EU01PTQ+KmUL+/y1eAccVJ+LCDIpCH0abhcfujYB4JMmjiX37P5qbRK6Qz5U+bQ+YkOAN445VEmZbby+w2+7frflmXq9ZuZWrGFV9YsAOD8336UWT9ah9u8FYDPPXo3p1TAW5e9HIDXtTzCa6o2cfxD76LyBj/vPPj1K4bkm3cR6aSN3r/qJADumH8oLZO38eBRvwNgzgNv5dMH38Y76jYPOffkD32g+HPtE5uIliwbtXn2uQgqKoj7+nY8loAfr/wHAPlkV1uc4dG+KXzvGd9WtRX9fH3W9RyS7qbK0gDExCzJG4vyYwG4bNkreO3Ex7m4YQE1gR//PXGO96w4gw09tQD05tMUft9C1WbfH7713R9wVMb3l7/0VgHw1c+8i8wl67h29rUAHH/rR6lckWHK1x/ExUkB97I/7crA/GU11dDSxNZjmgGo3FSg8tktWG9/8Z7f/oqZNPx9OVT6cwpLlwOw6IfHMeuSeQCs/dTxnHH+fbyx4WEAvrn6DB6bN53H3vxdAO7oHcN//fvb2Xh2P7896UcAhDgOzaS4rdevBT519XsAWHjR5cVyvvqN72TVq6qL286YehxBdSUu5+f+rtPn4D6wiX8cfj0nf9D3x8aPrSD/mm4sqWPvMQdQOW85yz8wkynfeNDXO5PhnfMXcn7tNgCmXf8BshtDxt/bT6bN13vTF3NcPefnVJm/FmfcfwnVlf0c1uLnxQ+N+wsf/uJHuOEr/817j3k9AHFHB5bJEHf7eS6sqabnpbP57g8u48isnyuP+fLFjP3l4/4eAYTTpuDWbSz226CulnhcM7ZqPZb2fXHurav5cssCXnXeuwB4109v4ms/+xcWfHiwrc565iz6vjqec773FwC+f+fpfOlVv99u3A63Merm9h5/n++MKrhxwxF0XzqJqmV+LrL1m6BQgHTGn9DfT/7waSx5j583D/7MMqKtbYP3TxhyD/WvR5gXdjSPJ+M4yGb9uN5NpWvKUqnx4yisW09Q68do3Nm522luV7RUqvhz8b4+cO9PpZPt+aHrmtJ1WhBi6RS3LHtgSLqzrr6Y6f/5uC9fb19x/IcN9UmdenGFfDEPy6Q568HV/HHOmKQwcbI9g8vlkm2OsK6umEfU0YGlM1gY4CJ/vIsi+s46hr9deeWI9b2yfQI3vOlknj2/iY+/8UYAfvGl11K7uBN7ZpkvW08PBCGp1hairduSzCJcoYAlfd719/u1cz43rEFtSNsElRXFcbHD9W0QYsHg2rM4ZwJhXQ1YgFVXFdctcUcnt3X9fJ5zbu5IddSTMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKwV8GZmX3czBaY2ZNmdq2ZVYxWwURERERERPYnexycmdlE4CPAXOfcYUAInD9aBRMREREREdmf7O3bGlNApZmlgCpg7d4XSUREREREZP+zx8GZc24N8C1gJbAOaHfO3TZaBRMREREREdmf7M3bGhuBc4EDgQlAtZm9fYTjLjSzh83s4bzr2/OSioiIiIiIvIjtzdsaXwksc85tcs7lgeuBlww/yDl3pXNurnNublrfFyIiIiIiIjKivQnOVgInmFmVmRlwGrBwdIolIiIiIiKyf9mbz5w9AFwHPAI8kaR15SiVS0REREREZL+S2puTnXNfBL44SmURERERERHZb+3tV+mLiIiIiIjIKFBwJiIiIiIiUgYUnImIiIiIiJQBBWciIiIiIiJlQMGZiIiIiIhIGVBwJiIiIiIiUgYUnImIiIiIiJQBBWciIiIiIiJlwJxz+yyzuuoJru3Z6iHbpt32Xg74lQGw8lVpLn/9T/jaR94FQNWSrRSaa8g1ZQCovPtpojnTePbNlRz0P+sB6DugmYrlW8hNaAAgvP9JgoZ6fjb/RsaGPq+TP/gBav+6CJfLAeAKBVy+QDBnln+9YDEuirBUmqCh3hesqZ64toJX/+xeAO44bQbR1FaCvjzWlwfg6S/UU1Gd46ZjfwjA9HQNh33/Elrm+3wq/v4U8WHTWfaGGqb+sReAzLPribu6ibu6fJ2/eCJ94/NM/QNULW8HoGdqPeagrzEEINsWUbV4M2xpg8C3levtw6qrcX19AJgZcU8PLvbXM2ysx/X1E/f2Yck5QVUVSz91KE+/7woAznrZG8A58uMbCHt8mbcdUkeqL6b+jkW+HcKAaGsbuNjnk0rjCnmCmhps/FhflpVriJNy7IilMyz6zlE8eO6lANQHFayLekkn+7+16RQCc5xUu5jvfuQtvv1un48rFMBs+/RC3zab33Ust3/x2zySqwVgTqaDW7qncsPGowDozFfw/em/YULKOPL2DwFwyL9vINq4CUvSjfv7YYRxYOlMsb2JIsJJE4hWr/X7MhlcLkc4cTxEvm0oFCCbgeQa9M5uJdPWz6ILapj90zZ/Xm8OtrX7NoXBds34Pj7QR4eUZ3j9LcACw0URWPL7lTgadoyNWKeyU1I3C8Mh1zusr2PZRw5lzJO+bn0NAS13rydu8OPa/Vcbq++YwoIPX85ZR70awF/XMCyOA1w8+LqkD9+y4kFm3f0OABadcvWQIp3+ugu49YZf8IO2yVzz5bMBqP3N/UOvQ9K2YV0dyz5xGADz3vddADbH/hq+feEF5KKQ+DctABz1wUdZ9bbxuDXriXt7h6RTFIS+zKk0S75+tD9kXD9xV5r6p1IAHP/2+dw2bw5kfH0+fPydTMtu5BP3/Av3n/Z9AM78yqdovWsj0eKlQ8schMWx4wp5cA7LZn1dmhpx1ZW41ev8/ijGwoA4lyeorvJtV1Xp+36F76/W1QPOEXd0FusUjm0h3rLV90/w/TWdGuzbyTGWyVBY4/MKG+shlSLesjXJ259rmUxxnA6MuWBcMu+kQqJnlxOObYHeZP4Z10L37GY2HuXbauFFlzOa5lx6CQBPfGLkdL+y+SB+v+xIAMZfuJWb599W3HfKE6+n5u1+3i/MmujrdO9jez9OzXY8D+xAUFFB0NhAYd367faFY5oBiLZsZek3TqDQUGDZa3+8x8X7ry0z+cmfX8nit/v7Tk+c480nvZEV36lj/KX+DrDmZVU89cHt2/TYf7sYgEKl0TcGFn5g8JhL1pzA5RPv54RPXwRA/a8e4NY18zl90jGD7ZCMp+J4HdNMtLWtOAYIDGKHpVPYpPEAxEtXELaMITd9HACbjq4i3ekICtD420f8adkscU8PQWOjP2fbNqyyEgv9dYjaO7C5hxGu3jTY71vHUKivJLV4tT+nvRPLpLF0iqitfY/bd0csleKKZ//q6xBnOS6b5mPr5gLwldZ/UBNU7PT833fV8caajhH3DVyXyi0Rcdqov28VAIV1G0hNGMfyd0yl9cF+ALL3LvRtMDDvJO1hqeTu72I/749Q/mDaVADiZasIaqqJtm0bdtDQOTk44mC+d+NPAJiV9veJGddeROU0X4/cgnqOP20BHblKAHo+N47uyZWk37ce+/YYX6dl24gaqmg7qAaAMbcvg4oshZY6AGb+YBF/mncEy865crsyf2D1iQD8aNJ9xW0H/9DPGQf+bhM3/+V3I7YnwEsffwP9v21l26GOqUf4dcbLxy6iJ8qwqMvPeddNv2OH55eadtt7i/eCsWE1B195CWMej9hwnp+jz5r5FIvOn0LfgU0AfOQHv+Z11V0cM+886i7z9ax8dgvx8lV+jQO4bIbN3wkY8572wfVKewfx9MnYouUAdJw9h/rbn6H7pTMBqLjpQSydweVzBBVJf5t1ADf++RrSFg4p80H/uIBzZz4BwLsa72VrXMF/zDjW74wjP5YTFlixz7Rd4Nv8gf+6Yrt2uGTNCdy9ajqTGtoAiL48ligbUnG/X9/GPT3+XjNsDg6qqor3M0ulh5TfOQexw+VzxTIN3N+KfXognSSe6HrJgYT9jor13bgFSwAImxu5Zd0P5jnn5m5XcPTkTEREREREpCwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkD5pzbZ5lNOrTeTbz0YgDa72nlwF+tZe0ZE6hfkQdg45FpGpbEtJ/XCUBdVR89t7ZyxL88CcDm97Sy9duO+rOfhX1Y7iKzofmagQUQR/u+LKVlGMkO2ieoqIAgicmnTcGiCLdsFVZf57fV1xItenbPyhKEAITNTZDPEbW1E1RV+eJEEa6/f8/SHTC8/Z+j1IFT/Q9xTLR2AwS+7Vy+sP01TOpiwWD7hpMmEK1Z78+JIiwMCSoriHv7/LFhgCsUsFTKv66pZs0Fs5n4i2dwPb3F8wBcLjeYl3ME1dXFc1xnF3Ff/877VRBigRXTw7nt2seyWV83IKyr8eWM3eA5A+mX9qFdte/AsaXHBSEWhjtOd+DYgfEycEwQgov9rlQaXIwrFEbOD7AjD2Hdy+qZcNc2/3rNRqItW337VVT4ZPv6hp43MD5L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0tOTMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMmHNun2VWMWOCu/SPswDYXKilKshx95aZzK7bAMAfFs/hc4ffypf/+joAjj3sWerTffztzsMBGPOoY+NxMOPX3biHnthpXkFtLcQxAHF394jHpMaPA6Cwbv32O81gF20TVFcT9/QMnhKGuEJhu+NW//5QJr1xAQCrrjuMyW96cqfpjmhYeSybxfX3b3eMpdIAuHwOS6W2K09QXV38eeD8cEwzhY2bAUi1thBt2lw8L6ioIO7rG5JG/tVzSd/2sC8T7LyddnFM2NwEQLRl647TGCm9YiW2T9fSGVw+t9tlGamdRhSEWODTcLHDAiNsHUuclN1FMUF9LYShTzcI2HrqAfQ1BrzivfcDsPC0WohdMb+B/mPZrE9j+DUdSVIPS6XB+T6+y/LvRn/erWNGmaVSALgowlJp/+9AG0cRQWUllvF9euUHDqVqvaPlzlUAxJs2E7SMIdq4CUvaJO7v93UI/DXAxSPXKQghjnZattSBUyksW7GDgvu2smyWcHwrAIXlK59T3bcrD+yyTDs8d9h5ls7gCnnC2loAoo6OPS/bP5OBthgYI8mcPNL4Chsb/Q8TxsLmbUQbN/kkamqIu7rAAiwZyy6K9uza7MpojctdHROExbkCIKyvI2pr3z4NCwibGgCItrb57c9HvUdiRmrqZADajxlP9/gQSqo0/roldJx8IH31/nfKvWd1kFtcR9VBvpyPHXctp088avt2GH7PgMFjStotqKryu3I5LJstXnvw84rr78fSGX9MPjc4ZsG3Uck4TI0fR2HDpqHzjxmpiRMorF4ztGzOkTpwKsCO55s90HpfHRtOHBz37W8/geY7lvl8Nm7e9XUdNq8ERx7CpmPqGXfB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dAdces7VnFPdM+SY85aexiP3zQJgyduuYNod72HpK68CoCvu4yXf+QTjv33vkHMslfLzTXFDUKyzZTK4fIGgIkswbqxvq+WrBtsEwDmCigqsuoq4w/dXAsNSKazGX1vX3gFBgNX6e4zr6YWpEyGA+MnFAKQmjINCgWjLNp93GOAKBaITDiP4x6NJ2bafmy2VwlKp4lwfNjUQbdmKpXw7WtrXz1KpwToVCgQtzWz9gR8/bfe38vLXPMKSj/jrtuzDxu9f8kOu3PQyHvvakQDUPbSaeOu2wXxra1h1wQwsaYqeY3qZMX4jm6+Zwtjrn/YbmxuInl2+XXmxAEv78hCG2OTxdM1sACDdFZGvDalc69dnLgzoG5tl1ZnQcp8vb82aHJ1TMqT6fLpNd6/CdXXh+vqL9+S4uxcCI6isAPw9deMlJ1Kz1l/rsC9mxZscy878CaMh73y68/rhhIqQs545i2fvmerLkoL3nX0Hn2321/rET13EhhMcC994GVkb7O/nLT2Nz078MwDdLsN1W49lwWcPB+Avv/jpLsvww7aJfP/ac5l4dy/pL20A4JzWx/jNx8/kez+6DIB/W/E6bpx5S/GcA//0fpad/ePt0prXn+OTH/ogAFX3LCLq6GL9R4+nYbFft1XftwSXyxf71c0L7tpl+d707CvpOTvHwv86CIBZlzzk+8Zxc+DBJwBIjWvls/feykHpbgDetuh8/njQ9UPaacDZLzkHgLiuClu+Fmv2c6sLA9jo5+ulnzoUgOlXraH70FZqPr3at8OUP3JCRbhdmo/n+vjs697j031s4dC+GkUENdW4KCbu8mM9NWkirqoCt3qdP6fblztsaSmm6ZJ71eZrW33bZXJUvnEbm9/gy/aJz/+az//9jRz00YUEjQ0AFNas5Y74d/Occ3NHaks9ORMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERERETKgIIzERERERGRMqDgTEREREREpAwoOBMRERERESkDCs5ERERE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EC1cPDp572m/GkHY0gJAtGnTYLrD5gNLJXNcFG0/xyb33yHHDDfQTiVltnSGYNoUAHqmNbL25BTjHvD7t81OkeqGtrn9HDHNj9cnHz6Q69/4XW7sOBKAq+5+GZPucNQ+vMbPCexFPxolO5yDdyE1cQIAhTVrBzeWrGd2K+9jDsXNW1CyYdg8uKtxshv3mB1t2616P5f6mPnxtIvrGc44EDq7Aeg+9gAqbp5HUJElaGwAoLBuA8EhMweTXb+JePI4bMlKyPt1HDMOwNZvwvX79Zzr7YUwxDIZANa8fw6TrlmC6+ourqWCljHkJzezZU4VAGN+dB/hzGlYLk+0Zp3Pq7KSwpEzSD+1wr+uryNauZot7zgWgM3HRYx5MKTx6R46DqwEoK85oP3IHKkKX28LYvJtFRz87c3kJ9T7bQVHoTLkcz+8GoDvHH4smBXXpbiYcPJE6O2j7eQDAKjYWiD9t8eKYzOoqSnWf+D+EDY3EW3dxprPnAjAxG/eR9jUSLStfeg1K+1XA2vWnVxTS2fAxYPzwrD7mE/Gtp9bdiFsqCfu7h1ch5fcF4dvK94nnds+NhhhvTCk75WmsaPyDYyJJK3UxAm47h4IA+Kp43zW85/mjug385xzc0dKQk/OREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTJgzrl9ltncIypcTeuXAAgKjj9f82PSFjL7pxcDUKh1uIY81QuyAEy6dSu2fC03P303AGec83ZuufGXHP3wv9By7iKf6GiX32zw51FKO6iqIu7pASD/6rmkb3t4hINCiKPnlm51NZZOARB1dPnzgxAACwwXRUPqkBo/Dtfdg1VV+g3pNL+773pOePidzGjaDMD1M24H4MAbLgRg5i/7sXsf276sQFDhr1PQ2EC8ZSvR0bN9Pl/dhHtNOzahFTZtAcDlC1hlBdGWrT6NkdrWjKCysvgy7u3FwtDXw1cKCwwswBXyQ89N0guqq2HGFGz1Bt8u29rBxVgYEtRU+2PDEMY0Qeh/N+FWrcPCgLirezC52GHpFOH4Vl+W+mo6Z9RRP9+n6yqzLPxoHQdd1kmwpQOA/NQWUm29dM1sAKBiYz+Zr2+k81uTmfZvCwFY/K1DWHNWRMO8jD9ma0y2LWLNBb4+35h7Pd/8z7fR02qc8db7APjDojmMuaGKey/9ob82t7yPRaf/iFM//kEqN+UAyC5cw8azptFy0xJf7y1bscAIDpwCwPpvpxn/wW7iTZsJWlsG2wFwge/zuUmNhH0FrBBTqM0U03V9fTBxHAALP17L2LvTNP3+cYJGX88Np09h7I1L6DhlGgB1T7fBxq1YdXItg6CYB5v99XdRDFGEZdL+0tbXUWhtIFiwlKCu1tdhQjO33HTNkMt8+LcvoWuq7w9L3/QjAKb/+iJm/3CTP2fx0iHHhw0NxJ2duNiBiwd37KD/le63VIpwTDMA8bhm1ryigdpVUXLdCmRXt7PutLGMuzvp0yvWEHd2bp/u8GxSKVyhACRjMpfDdfv5IWhuwnV3QzYLvX2+Th0dO00vqK0l7u7x/TyVTsof+zqXzinJHGMpP2dYJgNx7K8F+HE2bA66de2ju6zP7uiJc1QFmR3uX5Dr5e2PvZvfHPlTAGalq+mJc/S4PGPC6iHHfmzdXAC+O97Pozd013BH26G+vHcdzeK3X8GxX/D3lJZ/bMCt3wR5P77i/v7tr73Z6N1HzAiqqgC47KlbaQ1TXJGU7a6Tp7Dswwcz7cdLiTb5+XbgWJJxgAXEHR1DrtHAvcPlC4PZhCFBQ73f3teHO+gAeHwRrr+/WA7LZIrnWDqFyxeKczYAcezbo5hoQFgz2NZxbx/huLEUVq0uzvnFe8zAWNrddisdW8l5peMAMyyVJhw31r8uFFj7+mmMu7fNHx4aLgzoG1tJ9dN+rC99xzjGzotoP9C31YS7thF09hKtWUfbm44CYOscI5jWRbykBoD6JXDjl/6bU6/+NAD3vPNb9DnHw/3j+Ny1FwBQtQ76G4zqdb5uD37tCgBm//0d5Dp9H1521k8AOOz+twHw5AlD56kBJzz6Jk6f6Of+L7csAODGbn/Nv/Cjd1G10ZGrMeb/2+UAnPzBD7Dm9XlmvX9BMY0wmWddna+DW7fRX7vu5H4VhASZNMW1XOxwUUSqtQWX8/eHaMtWLJv1Yx6GzlMl18ZS6eK1DWpr/c/pZNw21uGqsvSOr+avP/1x8ZzIxYQ29Pf87191EkfWrgTggw2rALi/z88tJ1T4vvS1zX69cM/ZMyGfx/XnYKDfp0JWvXUak372tK9zdw/BuLHEGzfT+zI/nqqfWs+qN06m+Sk/tiv+/hRMn4wtX+vLldTRwnCwn+0Fd+IRvl0eWuDHZV//dvNlWFfn8x6Ys4OQsNGP0+LaZydSUycTb9hEnEvWN89xTQgU57OBOQQLCOprcf05rKLCb2uqp2NOM//4/o+Kp5193NlsfPUUxvzmcQByf2jmL4fcWNx/5uyTsYoKXGfnkPYs/Tk69Wg2fqyXvj4/n7mV1cz63grIZnCVfu7pmVLHyrMCDrrMrw3jpStxUeTXdgNrklyOsLa22H+tthYKBSwZA/TniNvafd5H+H7Ek0sgdliyrov7+4trRhcnY8PFhLW1MLAesQCrq6F/ml8Tpbf0EHT10XZMKw33r/GnVCT9v6PLv+7qhiAgaKgnbvJrlY7Z9dQv2MbSf2kCYNqvtxAvWkp04hwAlr0uy6yvLyaeOo5wi++Xiz8wkWc/98l5zrm5I11GPTkTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpA3sVnJnZGWb2jJktMbPPjVahRERERERE9jd7HJyZWQj8ADgTOAR4i5kdMloFExERERER2Z/szZOz44Alzrmlzrkc8Gvg3NEploiIiIiIyP5lb4KzicCqkterk21DmNmFZvawmT28aUu0F9mJiIiIiIi8eD3vXwjinLvSOTfXOTe3pTl8vrMTERERERH5p7Q3wdkaYHLJ60nJNhEREREREXmO9iY4ewiYaWYHmlkGOB+4cXSKJSIiIiIisn9J7emJzrmCmX0IuBUIgauccwtGrWQiIiIiIiL7kT0OzgCcczcDN49SWURERERERPZbz/sXgoiIiIiIiMiuKTgTEREREREpAwrOREREREREyoCCMxERERERkTKg4ExERERERKQMKDgTEREREREpAwrOREREREREyoCCMxERERERkTJgzrl9l5lZJ/DMPstQytUYYPMLXQh5QakPCKgfiPqAqA+It7/1g6nOuZaRdqT2cUGecc7N3cd5Spkxs4fVD/Zv6gMC6geiPiDqA+KpHwzS2xpFRERERETKgIIzERERERGRMrCvg7Mr93F+Up7UD0R9QED9QNQHRH1APPWDxD79QhAREREREREZmd7WKCIiIiIiUgb2WXBmZmeY2TNmtsTMPrev8pV9z8yuMrONZvZkybYmM7vdzBYn/zYm283Mvp/0i8fN7OgXruQyWsxsspndZWZPmdkCM/tosl39YD9hZhVm9qCZPZb0gS8n2w80sweSa/0bM8sk27PJ6yXJ/gNe0ArIqDGz0Mzmm9kfk9fqA/sZM1tuZk+Y2aNm9nCyTfeD/YiZNZjZdWb2tJktNLMT1QdGtk+CMzMLgR8AZwKHAG8xs0P2Rd7ygvgZcMawbZ8D/uKcmwn8JXkNvk/MTP67ELhiH5VRnl8F4JPOuUOAE4APJmNe/WD/0Q+8wjl3BHAkcIaZnQD8F/Ad59wMYBvw3uT49wLbku3fSY6TF4ePAgtLXqsP7J9e7pw7suTr0nU/2L98D7jFOXcQcAR+TlAfGMG+enJ2HLDEObfUOZcDfg2cu4/yln3MOXc3sHXY5nOBnyc//xx4Xcn2q513P9BgZuP3SUHleeOcW+eceyT5uRM/CU9E/WC/kVzLruRlOvnPAa8Arku2D+8DA33jOuA0M7N9U1p5vpjZJOBs4CfJa0N9QDzdD/YTZlYPnAL8FMA5l3POtaE+MKJ9FZxNBFaVvF6dbJP9R6tzbl3y83qgNflZfeNFLnlr0lHAA6gf7FeSt7M9CmwEbgeeBdqcc4XkkNLrXOwDyf52oHmfFlieD98FPgPEyetm1Af2Rw64zczmmdmFyTbdD/YfBwKbgP9N3uL8EzOrRn1gRPpCENnnnP+KUH1N6H7AzGqA3wMfc851lO5TP3jxc85FzrkjgUn4d1Ac9MKWSPYlM3sNsNE5N++FLou84F7qnDsa/3a1D5rZKaU7dT940UsBRwNXOOeOAroZfAsjoD5Qal8FZ2uAySWvJyXbZP+xYeCRdPLvxmS7+saLlJml8YHZNc6565PN6gf7oeTtK3cBJ+LfnpJKdpVe52IfSPbXA1v2bUlllJ0EnGNmy/EfZ3gF/nMn6gP7GefcmuTfjcD/4X9Zo/vB/mM1sNo590Dy+jp8sKY+MIJ9FZw9BMxMvqEpA5wP3LiP8pbycCPwzuTndwJ/KNn+juSbeU4A2kseccs/qeRzIj8FFjrnLi3ZpX6wnzCzFjNrSH6uBF6F/+zhXcCbksOG94GBvvEm4E6nP8T5T80593nn3CTn3AH4+/6dzrm3oT6wXzGzajOrHfgZeDXwJLof7Decc+uBVWY2O9l0GvAU6gMj2md/hNrMzsK/9zwErnLOfXWfZCz7nJldC5wKjAE2AF8EbgB+C0wBVgDnOee2Jov4y/Df7tgDvNs59/ALUGwZRWb2UuDvwBMMftbkX/GfO1M/2A+Y2eH4D3iH+F8E/tY59x9mNg3/FKUJmA+83TnXb2YVwC/wn0/cCpzvnFv6wpReRpuZnQp8yjn3GvWB/Utyvf8veZkCfuWc+6qZNaP7wX7DzI7EfzFQBlgKvJvk3oD6wBD7LDgTERERERGRHdMXgoiIiIiIiJQBBWciIiIiIiJlQMGZiIiIiIhIGVBwJiIiIiIiUgYUnImIiIiIiJQBBWciIiIiIiJlQMGZiIiIiIhIGVBwJiIiIiIiUgb+P5qBmZDSBKRZAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1080x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plots configuration.\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import plot, show, figure, imshow\n",
    "plt.rcParams['figure.figsize'] = (15, 6)\n",
    "\n",
    "# Plot HPCP.\n",
    "imshow(pool['tonal.hpcp'].T, aspect='auto', origin='lower', interpolation='none')\n",
    "plt.title(\"HPCPs in frames (the 0-th HPCP coefficient corresponds to A)\")\n",
    "show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can run a naive estimation of chords with 2-second sliding window over the computed HPCPgram:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'C', 'C', 'C', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'G', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'Em', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Am', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'Dm', 'F', 'F', 'F', 'F', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G']\n"
     ]
    }
   ],
   "source": [
    "from essentia.standard import ChordsDetection\n",
    "\n",
    "# Using a 2 seconds window over HPCP matrix to estimate chords\n",
    "chords, strength = ChordsDetection(hopSize=2048, windowSize=2)(pool['tonal.hpcp'])\n",
    "print(chords)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The estimated chord sequence can be further post-processed.\n",
    "\n",
    "TODO ChordsDescriptors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
